package Regex;
//正则表达式的介绍----matches
public class Describes {
    public static void main(String[] args) {
        /*
        字符类（只能匹配一个字符）：
        [abc]  只能是a,b,c其中一个
        [^abc]  除了a,b,c之外的如何字符
        [a-zA-Z] a到z A到Z 包括
        [a-d[m-p]]  a到d ,m到p
        [a-z&&[def]]   a-z和def的集合为:d,e,f
        [a-z&&[^bc]]  a-z和非bc的集合。(等同于[ad-z]
        [a-z&&[^m-p]]  a到z和除了m到p的集合（等同于[a-lq-z]）
         */

        //注意：一个范围只能匹配一个字符,两个字符则需要两个范围。如果出现两个以上包括两个的字符与范围比较，则都为false

        //只能是a,b,c其中一个
        System.out.println("字符类");
        System.out.println("------------1------------");
        System.out.println("a".matches("[abc]"));//true
        System.out.println("z".matches("[abc]"));//false
        System.out.println("ab".matches("[abc]"));//false

        //除了a,b,c之外的如何字符
        System.out.println("------------2------------");
        System.out.println("a".matches("[^abc]"));//false
        System.out.println("z".matches("[^abc]"));//true
        System.out.println("zz".matches("[^abc]"));//flase
        System.out.println("zz".matches("[^abc][^abc]"));//true

        //a到z A到Z 包括
        System.out.println("------------3------------");
        System.out.println("a".matches("[a-z]"));//true
        System.out.println("5".matches("[a-z]"));//false

        //a到d ,m到p
        System.out.println("------------4------------");
        System.out.println("d".matches("[a-d[m-p]]"));//true
        System.out.println("e".matches("[a-d[m-p]]"));//false

        //a-z和def的集合为:d,e,f
        //注意：&&必须是两个不能打一个
        System.out.println("------------5------------");
        System.out.println("d".matches("[a-d&&[def]]"));//true
        System.out.println("z".matches("[a-d&&[def]]"));//false

        //a-z和非bc的集合。(等同于[ad-z]
        System.out.println("------------6------------");
        System.out.println("b".matches("[a-z&&[^bc]]"));//false
        System.out.println("a".matches("[a-z&&[^bc]]"));//true

        //[a-z&&[^m-p]]  a到z和除了m到p的集合（等同于[a-lq-z]）
        System.out.println("------------7------------");
        System.out.println("b".matches("[a-z&&[^m-p]]"));//true
        System.out.println("m".matches("[a-z&&[^m-p]]"));//true



        /*
        预定义字符
        .    任何字符
        \d    一个数字
        \D    非数字
        \s    一个空白字符
        \S    非空白字符
        \w    英文，数字，下划线
        \W    一个非单词字符
         */
        System.out.println();
        // .    任何字符
        System.out.println("预定义字符");
        System.out.println("------------1------------");
        System.out.println("你".matches(".."));//fasle
        System.out.println("Hi".matches(".."));//true

        //\d    一个数字
        System.out.println("------------2------------");
        System.out.println("4".matches("\\d"));//true
        System.out.println("a".matches("\\d"));//false
        
        // \D    非数字
        System.out.println("------------3------------");
        System.out.println("a".matches("\\D"));//true
        System.out.println("3".matches("\\D"));//false

        // \s    一个空白字符
        System.out.println("------------4------------");
        System.out.println("\t".matches("\\s"));//true
        System.out.println("a".matches("\\s"));//false

        //        \S    非空白字符
        System.out.println("------------5------------");
        System.out.println("\t".matches("\\S"));//false
        System.out.println("a".matches("\\S"));//true

        //        \w    英文，数字，下划线
        System.out.println("------------6------------");
        System.out.println("\t".matches("\\w"));//false
        System.out.println("a".matches("\\w"));//true

        //        \W    一个非单词字符
        System.out.println("------------7------------");
        System.out.println("\t".matches("\\W"));//true
        System.out.println("a".matches("\\W"));//false

        /*
        数量词：
        X?   X,出现一次或多次
        X*   X,出现零次或多次
        X+   X,出现一次或多次
        X{n}   X,正好n次
        X{n,}   X,至少n次
        X{n,m}   X,至少n次但最多不超过m次
         */

        //必须是数字，下划线，字母 至少六位
        System.out.println("abfs_a".matches("\\w{6,}"));//true
        System.out.println("absfass_a".matches("\\w{6,}"));//false

        //必须是数字和字符 必须4位
        System.out.println("21ds".matches("[a-zA-Z]{4}"));//true
        System.out.println("21_s".matches("[a-zA-Z0-9]{4}"));//false
        System.out.println("21fs".matches("[\\w&&[^_]]{4}"));//true
        System.out.println("21_s".matches("[\\w&&[^_]]{4}"));//false

    }
}
